#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <chrono>
#include <sw/redis++/redis++.h>
#include "utill.hpp"

using namespace std;
using namespace sw::redis;

// expire ttl
void test1(Redis &redis)
{
    redis.flushall();
    // redis.set("key", "111", chrono ::seconds(5));
    redis.set("key", "111", 10s);

    auto result = redis.get("key");
    if (result)
    {
        cout << "value: " << result.value() << endl;
    }
    this_thread::sleep_for(3s);

    auto time = redis.ttl("key");
    cout << "time: " << time << endl;
}

// NX和XX
void test2(Redis &redis)
{
    redis.flushall();
    redis.set("key", "111");

    // set的重载版本中，没有单独提供NX和XX的选项，必须搭配过期时间使用
    redis.set("key", "222", 0s, UpdateType::EXIST);
    auto value = redis.get("key");
    if (value)
    {
        cout << "value: " << value.value() << endl;
    }
    else
    {
        cout << "key不存在" << endl;
    }
}

// mset mget
void test3(Redis &redis)
{
    redis.flushall();

    // 1. 使用初始化列表描述多个键值对
    // redis.mset({make_pair("key1", "111"), make_pair("key2", "222"), make_pair("key3", "333")});

    // 2. 把多个键值对组织在容器中，以迭代器形式传参
    vector<pair<string, string>> keys = {
        {"key1", "111"},
        {"key2", "222"},
        {"key3", "333"}};
    redis.mset(keys.begin(), keys.end());

    vector<OptionalString> result;
    auto it = back_inserter(result);
    redis.mget({"key1", "key2", "key3", "key4"}, it);

    PrintOptionalContainer(result);
}

// getrange setrange
void test4(Redis &redis)
{
    redis.flushall();
    redis.set("key", "0123456789");

    string result = redis.getrange("key", 2, 5);
    cout << result << endl;

    redis.setrange("key", 2, "000");
    auto value = redis.get("key");
    cout << "value: " << value.value() << endl;
}

// incr incrby
void test5(Redis &redis)
{
    redis.flushall();
    redis.set("key", "100");

    long long result = redis.incr("key");
    cout << "result: " << result << endl;

    auto value = redis.get("key");
    cout << "incr: " << value.value() << endl;

    result = redis.incrby("key", -10);
    cout << "result: " << result << endl;

    value = redis.get("key");
    cout << "incrby: " << value.value() << endl;
}

int main()
{
    Redis redis("tcp://127.0.0.1:6379");
    // test1(redis);
    // test2(redis);
    // test3(redis);
    // test4(redis);
    test5(redis);
}